package de.javakicker;

/**
 * The Class GameResult.
 */
public class GameResult
{
	/** Die Anzahl der Tore, die die Kontrahenten erzielt haben. */
	protected int[] goals = new int[2];

	/**
	 * Erzeugt ein neues Ergebnis.
	 *
	 * @param goals1 Die Anzahl der Tore, die Team 1 erzielt hat.
	 * @param goals2 Die Anzahl der Tore, die Team 2 erzielt hat.
	 */
	public GameResult(int goals1, int goals2)
	{
		goals[0] = goals1;
		goals[1] = goals2;
	}


	/**
	 * Instantiates a new game result.
	 */
	public GameResult()
	{
		goals[0] = goals[1] = 0;
	}


	/**
	 * Liefert die Anzahl der Tore, die ein bestimmtes Team erzielt hat.
	 *
	 * @param teamIndex 0 fuer Team1 und 1 fuer Team2.
	 * @return Die Anzahl der Tore.
	 */
	public int getGoals(int teamIndex)
	{
		if (teamIndex < 0 || teamIndex > 1)
			throw new IndexOutOfBoundsException();
		return goals[teamIndex];
	}


	/**
	 * Sets the goals.
	 *
	 * @param teamIndex the team index
	 * @param numGoals the num goals
	 */
	public void setGoals(int teamIndex, int numGoals)
	{
		if (teamIndex == 0 || teamIndex == 1)
			goals[teamIndex] = numGoals;
	}


	/**
	 * Adds the goal.
	 *
	 * @param teamIndex the team index
	 */
	public void addGoal(int teamIndex)
	{
		if (teamIndex == 0 || teamIndex == 1)
			goals[teamIndex]++;
	}


	/**
	 * Ermittelt die Tordifferenz fuer ein Team.
	 *
	 * @param teamIndex 0 fuer Team1 und 1 fuer Team2.
	 * @return Die Tordifferenz.
	 */
	public int getDifference(int teamIndex)
	{
		if (teamIndex == 0)
			return goals[0] - goals[1];
		else if (teamIndex == 1)
			return goals[1] - goals[0];
		else
			throw new IndexOutOfBoundsException();
	}


	/**
	 * Ermittelt die Punktzahl fuer ein Team.
	 *
	 * @param teamIndex 0 fuer Team1 und 1 fuer Team2.
	 * @return Die Punktzahl fuer das Team. Diese betraegt 3 bei einem Sieg, 1 bei
	 * einem Unentschieden und 0 bei einer Niederlage.
	 */
	public int getScore(int teamIndex)
	{
		if (goals[0] == goals[1])
			return 1;
		else if (teamIndex == 0)
			return (goals[0] > goals[1]) ? 3 : 0;
		else if (teamIndex == 1)
			return (goals[1] > goals[0]) ? 3 : 0;
		else
			throw new IndexOutOfBoundsException();
	}


	/** Vertauscht die Anzahl der Tore fuer Team 1 und Team 2. Dies kann verwendet
	 * werden, um das Ergebnis aus Sicht des jeweils anderen Teams darzustellen. */
	public void swap()
	{
		int tmp = goals[0];
		goals[0] = goals[1];
		goals[1] = tmp;
	}


	/**
	 * Checks if is win.
	 *
	 * @param teamIndex the team index
	 * @return true, if is win
	 */
	public boolean isWin(int teamIndex)
	{
		return getDifference(teamIndex) > 0;
	}


	/**
	 * Checks if is loss.
	 *
	 * @param teamIndex the team index
	 * @return true, if is loss
	 */
	public boolean isLoss(int teamIndex)
	{
		return getDifference(teamIndex) < 0;
	}


	/** Prueft, ob das Spiel unentschieden ist.
	 * @return <code>true</code>, falls das Spiel unentschieden ist, sonst
	 *         <code>false</code>.
	 */
	public boolean isDraw()
	{
		return goals[0] == goals[1];
	}


	/**
	 * Liefert eine <code>String</code>-Repraesentation des Ergebnisses,
	 * z.B. "2 : 1".
	 *
	 * @return the string
	 */
	public String toString()
	{
		return Integer.toString(goals[0]) + " : " + Integer.toString(goals[1]);
	}
}